﻿using System.Collections.Generic;
using System.Text;
using Core.Domain;
using Core.Domain.Lexems;

namespace Core.SyntaxAnalysis.Classes
{
    public class FuncCall : Expr
    {
        public List<Expr> Parameters;

        public FuncCall(Lexem funcName, List<Expr> parameters)
        {
            Parameters = parameters;
            Lex = funcName;
            Type = new Void();
            // TODO: тип резульата должен биндиться через писание функции как в переменных (пока нет, т.к. описания функций не поддерживаются)
        }

        public override DataType GetExprType()
        {
            return Type;
        }

        public override bool StmtSemanticCheck(ref List<CompilerError> errors)
        {
            //TODO: implement adding functions
            return true;
            List<DataType> formalParams = Env.GetPrototype(Lex.StrValue);

            if (formalParams == null)
            {
                errors.Add(new CompilerError(errors.Count, "Фнукция с именем " + Lex.StrValue + " не определена", Lex));
                return false;
            }

            if (Parameters.Count != formalParams.Count)
            {
                errors.Add(new CompilerError(errors.Count, "Количество формальных и фактических параметров не совпадает", Lex));
                return false;
            }
            for (int i = 0; i < Parameters.Count; i++)
            {
                if (Parameters[i].GetExprType().Equals(formalParams[i]))
                {
                    continue;
                }
                errors.Add(new CompilerError(errors.Count, "Тип фактического параметра " + Parameters[i].Lex.StrValue + " с номером " + (i + 1) + " не совпадает с формальным", Lex));
                return false;
            }

            return true;
        }

        public override void StmtGenerate(StringBuilder s)
        {
            CodeGenerator.AppendFuncCall(s, this);
        }
    }
}